/**
 * ADC0804
 * ADC0804是一款8位、单通道、低价格A/D转换器，主要特点是：
 *      模数转换时间大约100us；
 *      方便TTL或CMOS标准接口；
 *      可以满足差分电压输入；
 *      具有参考电压输入端；
 *      内含时钟发生器(RC震荡)；
 *      单电源工作时（0～5）V输入电压范围是0～5V；
 *      不需要调零等等。
 *      ADC0804是一款早期的AD转换器，而且因其价格低廉而在要求不高的场合得到广泛应用。
 * 
 * 引脚说明:
 *  CS:         片选
 *  RD:         把转换完成的数据加载到DB口
 *  WR:         启动采样
 *  INTR:       外部中断, 转换完后通知MCU
 *  DB7~DB0:    转换完后输出
 *  CLK R:      RC振荡电路, 给AD提供时钟
 *  CLK IN:     或者自己外接震荡源(100~1460KHz)
 *  Vin(+), Vin(-): 差分信号输入
 *  A GND:      模拟电压的地
 *  Vref/2:     参考电压
 *  D GND:      数字电压的地 (if做高精度, 不要和A GND接在一起, 会有干扰)
 *  转换速度:   根据 f_CLK = 1/(1.1RC) 计算
 * 
 * 在TX-1C: INTR: 悬空 Vin(-): 接地
 *          f_CLK = 1/(1.1 * 10KΩ * 10*10^4pF) = 1000/1.1 = 909.090909Hz
 */
#include <REGX52.H>
#include "Delay_Utils.h"

//片选段, 低电平有效
bit AD_ADC0804_CS;
//把转换完成的数据加载到DB口
sbit AD_ADC0804_RD = P3^7;
//启动采样
sbit AD_ADC0804_WR = P3^6;
//外部中断, 转换完后通知MCU
bit AD_ADC0804_INTR;

//数据输入引脚 P1
sfr AD_ADC0804_DATA_PORT = 0x90;


void ADC0804_Init(bit isTx1C) {
    if (isTx1C) {
        //打开U2的 CSAD
        P0 = 0x7F;
    }
}

/**
 * 启动AD转换, 启动后要延时 "NOT BUSY" & "BUSY", 然后才能转换完成!
 * 时间根据 f_CLK 计算, 具体看时序图
 */
void ADC0804_Start() {
    AD_ADC0804_WR = 1;
    AD_ADC0804_WR = 0;
    //延时t_WL
    // Delay_t_WL();
    AD_ADC0804_WR = 1;
    //延时 "NOT BUSY" & "BUSY", 具体要计算, 请看时序图
    // Delay_NOT_BUSY_and_BUSY();
}

/**
 * 读AD
 */
unsigned char ADC0804_ReadAD() {
    static unsigned char Data;
    //读之前先把数据口初始化
    AD_ADC0804_DATA_PORT = 0xFF;
    AD_ADC0804_RD = 0;
    //延时 t_ACC 后才能读取到数据
    // Delay_t_ACC();
    Data = AD_ADC0804_DATA_PORT;
    AD_ADC0804_RD = 1;
    return Data;
}
